package org.azmat.demoredis.Redis.RedisTemplate;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
public class RedisOpsForZSet {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void test(){
        /**
         * ● add(K k,V v,double v1)：添加元素。
         * ● size(K k)：返回集合中元素的个数。
         * ● Set<V> range(K k,Long l, long l1)：返回指定索引范围的元素。
         * ● rank(K k,Object o)：返回某个元素的索引。
         */
        redisTemplate.opsForZSet().add("myzset","语文",90);
        redisTemplate.opsForZSet().add("myzset","数学",75);
        redisTemplate.opsForZSet().add("myzset","英语",80);
        // 获取集合中元素的个数
        System.out.println(redisTemplate.opsForZSet().size("myzset"));
        // 获取指定索引范围的元素
        System.out.println(redisTemplate.opsForZSet().range("myzset",0,-1));
        // 获取某个元素的索引
        System.out.println(redisTemplate.opsForZSet().rank("myzset","数学"));
    }

    @Test
    void test2(){
        /**
         * ● score(K k,Object o)：返回某个元素的分数。
         * ● rangeByScore(K k,double v,double v1)：返回指定分数范围的元素。
         * ● count(K k,double v,double v1)：返回指定分数范围的元素的个数。
         */
        redisTemplate.opsForZSet().add("myzset1","语文",90);
        redisTemplate.opsForZSet().add("myzset1","数学",75);
        redisTemplate.opsForZSet().add("myzset1","英语",80);
        redisTemplate.opsForZSet().add("myzset1","物理",60);
        redisTemplate.opsForZSet().add("myzset1","化学",50);
        // 返回全部元素
        System.out.println(redisTemplate.opsForZSet().range("myzset1",0,-1));
        // 返回某个元素的分数
        System.out.println(redisTemplate.opsForZSet().score("myzset1","数学"));
        // 返回指定分数范围的元素
        System.out.println(redisTemplate.opsForZSet().rangeByScore("myzset1",60,90));
        // 返回指定分数范围的元素的个数
        System.out.println(redisTemplate.opsForZSet().count("myzset1",60,90));
    }

    @Test
    void test3(){
        /**
         * ● remove(K k,Object... o)：删除元素。
         * ● removeRange(K k,long l, long l1)：删除指定索引范围的元素。
         * ● removeRangeByScore(K k,double v,double v1)：删除指定分数范围的元素。
         */
        redisTemplate.opsForZSet().remove("myzset1","数学");
        System.out.println(redisTemplate.opsForZSet().range("myzset1",0,-1));
        redisTemplate.opsForZSet().removeRange("myzset1",0,1);
        System.out.println(redisTemplate.opsForZSet().range("myzset1",0,-1));
        redisTemplate.opsForZSet().removeRangeByScore("myzset1",60,90);
        System.out.println(redisTemplate.opsForZSet().range("myzset1",0,-1));
    }
}
